package utils

import (
	"fmt"
	"github.com/golang-jwt/jwt/v4"
	"time"
)

type CustomClaims struct {
	// 可根据需要自行添加字段
	Id                   uint   `json:"id"`
	Identity             string `json:"identity"`
	Name                 string `json:"name"`
	jwt.RegisteredClaims        // 内嵌标准的声明
}

const secretKey = "sa543b123cdefvwxyzABCD8438EF"

// GenToken 生成JWT
func GenToken(id uint, identity string, name string, hour int) (string, error) {
	// 创建一个我们自己声明的数据
	claims := CustomClaims{
		id,
		identity,
		name, // 自定义字段
		jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * time.Duration(hour))), // 定义过期时间
			Issuer:    "somebody",                                                          // 签发人
		},
	}
	//使用 HMAC-SHA256 算法进行签名
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 生成签名字符串
	return token.SignedString([]byte(secretKey))
}

func ParseToken(tokenString string) (*CustomClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{},
		//返回密钥
		func(token *jwt.Token) (interface{}, error) {
			//判断签名算法是否为 HMAC
			if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
				return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
			}
			return []byte(secretKey), nil
		})
	if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}
